package com.wangdong.mijiqiqi;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.TextView;

public class TextActivity extends AppCompatActivity {

    private TextView mText;
    private String string="今天晚上下雨啦!";
    private String URL="http://www.jianshu.com/users/dbae9ac95c78";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text);
        mText = (TextView)findViewById(R.id.tv_text);

        /*SpannableString 能够更简便的设置文字样式*/
        SpannableString spannableString = new SpannableString(string);
        /*方法setSpan(Object what,int start,int end,int flags)   翻译：Span 范围
        * 参数说明：
        * Object what 对应的各种Span ，
        * int start 开始应用指定Span的位置，索引从0开始，
        * int end 结束应用指定span的位置，特效并不包括这个位置，比如如果这里数为3（即第4个字符） ，第4个字符不会有任何效果
        * int flage 取值有如下四个
        *           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括，即在指顶范围的前面和后面插入新字符都不会应用新样式
        *           Spannable.SPAN_EXCLUSIVE_INCLUSIVE：前面不包括，后面包括。即仅在范围字符的后面插入新字符时会应用新样式
        *           Spannable.SPAN_INCLUSIVE_EXCLUSIVE：前面包括，后面不包括。Spannable.SPAN_INCLUSIVE_INCLUSIVE：前后都包括。
        *           flag的设置最后再说，这里先设为0。*/
//        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#ff3c2a")),string.indexOf("晚上"),string.indexOf("下"),0);
//        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#ff3c2a")),2,4,0);同上
        /*设置所需要的显示的背景颜色*/
//        spannableString.setSpan(new BackgroundColorSpan(Color.parseColor("#ff3c2a")),string.indexOf("晚"),string.indexOf("下"),0);
        /*设置所需要的显示的字体大小*/
//        spannableString.setSpan(new AbsoluteSizeSpan(25),string.indexOf("晚"),string.indexOf("下"),0);
        /*设置所需要的显示文字相对大小*/
//        RelativeSizeSpan sizeSpan01 = new RelativeSizeSpan(1.2f);
//        RelativeSizeSpan sizeSpan02 = new RelativeSizeSpan(1.4f);
//        RelativeSizeSpan sizeSpan03 = new RelativeSizeSpan(1.6f);
//        RelativeSizeSpan sizeSpan04 = new RelativeSizeSpan(1.8f);
//        RelativeSizeSpan sizeSpan05 = new RelativeSizeSpan(1.6f);
//        RelativeSizeSpan sizeSpan06 = new RelativeSizeSpan(1.4f);
//        RelativeSizeSpan sizeSpan07 = new RelativeSizeSpan(1.2f);
//
//        spannableString.setSpan(sizeSpan01, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        spannableString.setSpan(sizeSpan02, 1, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        spannableString.setSpan(sizeSpan03, 2, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        spannableString.setSpan(sizeSpan04, 3, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        spannableString.setSpan(sizeSpan05, 4, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        spannableString.setSpan(sizeSpan06, 5, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        spannableString.setSpan(sizeSpan07, 6, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        /*设置所需要显示上角标，可以写数学指数，从效果图可以看出，被设置为上标的文字大小和下面的文本文字大小一样，只要我们稍加修饰，结合RelativeSizeSpan设置小字体文本作为上标，分分钟实现指数公式有木有，再也不用2^2+3^2=13这样缺乏审美的数学公式了，是不是超实用？*/
//        SuperscriptSpan superscriptSpan = new SuperscriptSpan();
//        spannableString.setSpan(superscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        /*设置所需要显示下角标*/
//        SubscriptSpan subscriptSpan = new SubscriptSpan();
//        spannableString.setSpan(subscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        /*设置所需要显示可以点击的文本,可以传参*/
//        MyClickableSpan clickableSpan = new MyClickableSpan("http://www.jianshu.com/users/dbae9ac95c78");
//        spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//        mText.setMovementMethod(LinkMovementMethod.getInstance());
//        mText.setHighlightColor(Color.parseColor("#36969696"));
        /*设置显示超链接点击跳转到浏览器*/
        URLSpan urlSpan = new URLSpan("http://www.jianshu.com/users/dbae9ac95c78");
       /* URLSpan 的方法已经写了点击方法就不用我们写了
       @Override
        public void onClick(View widget) {
            Uri uri = Uri.parse(getURL());
            Context context = widget.getContext();
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString());
            }
        }*/
        spannableString.setSpan(urlSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        mText.setMovementMethod(LinkMovementMethod.getInstance());
        mText.setHighlightColor(Color.parseColor("#36969696"));
//        除此之外，还有MaskFilterSpan可以实现模糊和浮雕效果，RasterizerSpan可以实现光栅效果，因为以上两个使用频率不高，而且效果也不是很明显，就不做详细说明，有兴趣的小伙伴不妨去试一试。
        /*设置粗斜体所需要显示的*/
//        spannableString.setSpan(new StyleSpan(Typeface.BOLD_ITALIC),string.indexOf("晚"),string.indexOf("下"),0);
        /*设置所要显示的删除线 中线*/
//            spannableString.setSpan(new StrikethroughSpan(),string.indexOf("晚"),string.indexOf("下"),0);
        /*设置所要显示的下划线*/
//            spannableString.setSpan(new UnderlineSpan(),string.indexOf("晚"),string.indexOf("下"),0);
        /*设置所要显示的显示成图片*/
//        Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
//        drawable.setBounds(0,0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
//        ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);
//        spannableString.setSpan(span,string.indexOf("晚"),string.indexOf("下"),0);
        /*最后说一下，setSpan方法中最后一个参数
        * 对EditText 使用spannableString,如果我们设置Spannable.SPAN_EXCLUSIVE_INCLUSIVE,在“晚上”前面和后面都输入文字，前面的文字没有任何效果，后面的则不同
        * ，添加上相同的Span效果，（前面的不应特效，后面应用特效），其他几个Flags参数的含义不再赘述*/

        /**SpannableStringBuilder
        应该有不少开发的小伙伴知道StringBuilder，可以使用append()方法实现字符串拼接，非常方便。同样，
        SpannableString中也有SpannableStringBuilder，顾名思义，就是实现对，SpannableString的一个拼接效果，
        同样是append()方法，可以实现各种风格效果的SpannableString拼接，非常实用。*/

        mText.setText(spannableString);
    }

//   点击方法
    class MyClickableSpan extends ClickableSpan {

        private String content;

        public MyClickableSpan(String content) {
            this.content = content;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setUnderlineText(false);
        }

        @Override
        public void onClick(View widget) {
            //            Intent intent = new Intent(TextActivity.this, OtherActivity.class);
            //            Bundle bundle = new Bundle();
            //            bundle.putString("content", content);
            //            intent.putExtra("bundle", bundle);
            //            startActivity(intent);
        }
    }

}
